﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace CJFirewall.Kernel
{
    class GetAppIcon
    {
        [DllImport("Shell32.dll")]
         private static extern int SHGetFileInfo
         (
         string pszPath,
         uint dwFileAttributes,
         out SHFILEINFO psfi,
         uint cbfileInfo,
         SHGFI uFlags
         );
 
         [StructLayout(LayoutKind.Sequential)]
         private struct SHFILEINFO
         {
             public SHFILEINFO(bool b)
             {
                 hIcon = IntPtr.Zero; iIcon = 0; dwAttributes = 0; szDisplayName = ""; szTypeName = "";
             }
             public IntPtr hIcon;
             public int iIcon;
             public uint dwAttributes;
             [MarshalAs(UnmanagedType.LPStr, SizeConst = 260)]
             public string szDisplayName;
             [MarshalAs(UnmanagedType.LPStr, SizeConst = 80)]
             public string szTypeName;
         };
 
         private enum SHGFI
         {
             SmallIcon = 0x00000001,
             LargeIcon = 0x00000000,
             Icon = 0x00000100,
             DisplayName = 0x00000200,
             Typename = 0x00000400,
             SysIconIndex = 0x00004000,
             UseFileAttributes = 0x00000010
         }
        //获取进程图标
         private static Icon GetIcon(string strPath, bool bSmall)
         {
             SHFILEINFO info = new SHFILEINFO(true);
             int cbFileInfo = Marshal.SizeOf(info);
             SHGFI flags;
             if (bSmall)
                 flags = SHGFI.Icon | SHGFI.SmallIcon | SHGFI.UseFileAttributes;
             else
                 flags = SHGFI.Icon | SHGFI.LargeIcon | SHGFI.UseFileAttributes;
 
             SHGetFileInfo(strPath, 256, out info, (uint) cbFileInfo, flags);
             return Icon.FromHandle(info.hIcon);
         }

        //获取进程图标
         private static Icon GetIcon(int pid, bool bSmall)
         {
 
             try
             {
                 var p = System.Diagnostics.Process.GetProcessById(pid);
 
                 return GetIcon(p.MainModule.FileName, bSmall);
             }
             catch (Exception )
             {
                 return null;
             }
         }

        //保存
        public void GetIcon()
        {
            string path = AppDomain.CurrentDomain.BaseDirectory;
            string rootpath = path.Substring(0, path.LastIndexOf("bin"));

            Process[] ps = Process.GetProcesses();
            foreach(var p in ps)
            {
                Icon th = GetIcon(p.Id,false);
                try
                {
                    if (th!=null)
                    {
                        FileStream fileStream = new FileStream(rootpath + "\\Icon\\" + p.ProcessName + ".png", FileMode.CreateNew);
                        th.Save(fileStream);
                    }

                }
                catch (Exception)
                { }
            }
        }
 }
}
